package com.basic.juc;

/**
 * locate com.basic.juc
 * Created by mastertj on 2018/4/7.
 * 
 * 本类是一个简单的任务类，实现了Runnable接口，用于提交到线程池中执行
 * 
 * 在线程池的应用中，通常需要定义任务类来封装要执行的业务逻辑：
 * 1. 任务类通常实现Runnable接口或Callable接口
 * 2. Runnable接口的任务没有返回值，而Callable接口的任务有返回值
 * 3. 任务类应该是自包含的，即包含执行任务所需的所有数据
 * 4. 任务类应该是无状态的或线程安全的，以避免并发问题
 */
/**
 * 任务类，实现Runnable接口
 * 用于提交到线程池中执行的任务
 */
public class Task implements Runnable {
    // 任务ID，用于标识不同的任务
    private int id;
    // 任务名称，用于描述任务
    private String name;

    /**
     * 带参数的构造方法
     * 
     * @param id   任务ID
     * @param name 任务名称
     */
    public Task(int id, String name) {
        this.id = id;
        this.name = name;
    }

    /**
     * 无参构造方法
     */
    public Task() {
    }

    /**
     * 获取任务ID
     * 
     * @return 任务ID
     */
    public int getId() {
        return id;
    }

    /**
     * 设置任务ID
     * 
     * @param id 任务ID
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * 获取任务名称
     * 
     * @return 任务名称
     */
    public String getName() {
        return name;
    }

    /**
     * 设置任务名称
     * 
     * @param name 任务名称
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 重写toString方法，用于打印任务信息
     * 
     * @return 任务的字符串表示
     */
    @Override
    public String toString() {
        return "Task{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    /**
     * 实现Runnable接口的run方法
     * 这是任务的执行逻辑，当任务被线程池调度执行时，会调用此方法
     * 本例中，任务会打印开始执行的信息，然后休眠8秒钟，模拟耗时操作
     */
    @Override
    public void run() {
        try {
            // 打印任务开始执行的信息
            System.out.println("Task " + id + " (" + name + ") start Running.....");
            // 休眠8秒钟，模拟耗时操作
            Thread.sleep(8000);
            // 打印任务完成的信息
            System.out.println("Task " + id + " (" + name + ") finished.");
        } catch (InterruptedException e) {
            // 处理线程中断异常
            System.out.println("Task " + id + " was interrupted.");
            e.printStackTrace();
        }
    }
}
